#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>


// 以前我并不知道子进程什么时候退出，我要waitpid等待子进程退出
// 现在父进程就可以被动通知父进程
// 但是会遇到一个问题(很多子进程同时退出了，但是同类信号会被阻塞)
void Count(int cnt)
{
    while (cnt)
    {
        printf("cnt:%2d\r", cnt--);
        fflush(stdout);
        sleep(1);
    }
    printf("\n");
}

void handler(int signo)
{
    //printf("pid:%d,%d 号信号，正在被捕捉！\n",getpid(),signo);

    // 1.我又非常多的子进程，在统一时刻退出了
    // waitpid(-1) -> while(1)    // -1:不需要管pid，只有是子进程退出了，我就回收

    // 2.我有非常多的子进程，在同一时刻只有一部分退出了
    while(1)
    {
        pid_t ret = waitpid(-1,NULL,WNOHANG);//非阻塞，没有子进程需要回收，我就出去做其他事情
        if(ret == 0) break;
    }
}
int main()
{
    // signal(SIGCHLD,handler);//SIGCHLD:17
    signal(SIGCHLD,SIG_IGN);// 如果不想手动回收子进程，可以对17号信号忽略，OS会自动回收
    printf("我是父进程，pid:%d,ppid:%d\n", getpid(), getppid());

    pid_t id = fork();
    if (id == 0)
    {
        printf("我是子进程，pid:%d,ppid:%d\n", getpid(), getppid());
        Count(5);
        exit(1);
    }

    while(1) sleep(1);
    return 0;
}